<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
<script>
// TODO: 题目
// 1.如何准确判断一个变量是不是数组
// 2.手写一个简易的jQuery 考虑插件和扩展性
// 3.原型和原型链的本质 & 图示规则
// 4.new 一个函数的过程发生了什么

// 类
class Student {
    constructor(name, number) {
        this.name = name
        this.number = number
        // this.gender = 'male'
    }
    sayHi() {
        console.log(
            `姓名 ${this.name} ，学号 ${this.number}`
        )
    }
    // study() {

    // }
}

// 通过类 new 对象/实例
const xialuo = new Student('夏洛', 100)
console.log(xialuo.name)
console.log(xialuo.number)
xialuo.sayHi()

const madongmei = new Student('马冬梅', 101)
console.log(madongmei.name)
console.log(madongmei.number)
madongmei.sayHi()


// TODO: new 一个函数发生了什么?
function mockNew(constructor, ...arg) {
    // 1.建立一个空对象, 原型proto指向构造函数的原型对象
    const obj = Object.create(constructor.prototype);
    // 2. 调用构造函数, 把新对象作为上下文注入, 并传入参数
    const result = constructor.apply(obj, arg);
    // 3. 如果 return 的是非对象(数字、字符串、布尔类型等)会忽而略返回值, 如果return的是对象, 则返回该对象
    return result || obj; // 需要改造下才能完善
}
function Person(name) {
    this.name = name;   
}
const person = mockNew(Person, 'test');
</script>
</body>
</html>